package br.com.datasun.biblioteca.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import br.com.datasun.biblioteca.dao.factory.ConnectionFactory;
import br.com.datasun.biblioteca.entities.Assunto;
import br.com.datasun.biblioteca.entities.Contato;
import br.com.datasun.biblioteca.entities.Documento;
import br.com.datasun.biblioteca.entities.Pessoa;
import br.com.datasun.biblioteca.entities.PessoaFisica;
import br.com.datasun.biblioteca.entities.TipoContato;
import br.com.datasun.biblioteca.exceptions.DAOException;

public class ContatoDAO {
	public void carregarContatosDe(List<? extends Pessoa> pessoas)throws DAOException{
		//TODO implementar a listagem dos contatos da pessoa
		//TODO setar os contatos retornados no objeto pessoa adequado
		StringBuilder clausulaIN = new StringBuilder();
		for (Pessoa pessoa : pessoas){
			clausulaIN.append(pessoa.getId()+",");
		}
		clausulaIN.append("0");
		Connection connection = null;
		PreparedStatement preparedStatement   = null;
		ResultSet resultSet   = null;
		StringBuilder sql = new StringBuilder();
		sql.append(" select contato.id ");
		sql.append("       ,contato.numero ");
		sql.append("       ,contato.id_pessoa ");
		sql.append("       ,contato.id_tipo_contato ");
		sql.append("       ,tipo_contato.descricao as descricao_tipo_contato ");
		sql.append("   from contato ");
		sql.append("   join tipo_contato on (contato.id_tipo_contato = tipo_contato.id ) ");
		sql.append("  where contato.id_pessoa in ("+clausulaIN.toString()+")");
		Map<Long, List<Contato>> contatosDaPessoaMap = new HashMap<Long, List<Contato>>();
		try{
			connection = ConnectionFactory.createConnectionToMySQL();
			preparedStatement = connection.prepareStatement(sql.toString());
			resultSet = preparedStatement.executeQuery();
			while (resultSet.next()) {
				long idContato = resultSet.getLong("id");
				String numero = resultSet.getString("numero");
				long idPessoa = resultSet.getLong("id_pessoa");
				long idTipoContato = resultSet.getLong("id_tipo_contato");
				if (idContato != 0){
					Contato contato = new Contato();
					contato.setId(idContato);
					contato.setNrContato(numero);
					contato.setTipoContato(TipoContato.getValueOf(idTipoContato));
					List<Contato> contatosDaPessoa = contatosDaPessoaMap.get(idPessoa);
					if (contatosDaPessoa == null){
						contatosDaPessoa = new ArrayList<Contato>();
						contatosDaPessoa.add(contato);
						contatosDaPessoaMap.put(idPessoa, contatosDaPessoa);
					}else{
						contatosDaPessoa.add(contato);
					}
				}							
			}//Loop While resultSet
			
			for (Pessoa pessoa : pessoas){
				List<Contato> contatos = contatosDaPessoaMap.get(pessoa.getId());
				if (contatos != null) {
				
					for (Contato contato : contatos){
						contato.setPessoa(pessoa);
					}					
				}
				
				pessoa.setContatos(contatos);
			}
		}catch (Exception e) {
			throw new DAOException(e);
		}finally{
			try{
				if(resultSet != null){
					resultSet.close();
				}
				if(preparedStatement != null){
					preparedStatement.close();
				}
				if(connection != null){
					connection.close();
				}
			}catch (Exception e) {
				throw new DAOException(e);
			}
		}
	}
	
	public Contato inserir(Contato contato) throws DAOException{
		Connection connection = null;
		PreparedStatement preparedStatement   = null;
		ResultSet resultSet = null;
		StringBuilder sql = new StringBuilder();
		sql.append(" insert into contato (numero, id_tipo_contato, id_pessoa) VALUES(?,?,?)");
		try{
			connection = ConnectionFactory.createConnectionToMySQL();
			preparedStatement = connection.prepareStatement(sql.toString(), Statement.RETURN_GENERATED_KEYS);
			
			
			
			preparedStatement.setString(1, contato.getNrContato());
			preparedStatement.setLong(2, contato.getTipoContato().getId());
			Pessoa pessoa = contato.getPessoa();
			preparedStatement.setLong(3, pessoa.getId());
			preparedStatement.execute();
			resultSet = preparedStatement.getGeneratedKeys();

			if(resultSet.next()){  
			  long idGerado = resultSet.getLong(1);
			  contato.setId(idGerado);
			}
			
		}catch (Exception e) {
			throw new DAOException(e);
		}finally{
			try{
				if(resultSet != null){
					resultSet.close();
				}
				if(preparedStatement != null){
					preparedStatement.close();
				}
				if(connection != null){
					connection.close();
				}
			}catch (Exception e) {
				throw new DAOException(e);
			}
		}
		return contato;
	}
	
	public boolean atualizarContato(Contato contato) throws DAOException{
		boolean result = false;
		Connection connection = null;
		PreparedStatement preparedStatement   = null;
		StringBuilder sql = new StringBuilder();
		sql.append("update contato ");
		sql.append("   set numero = ? ");
		sql.append("      ,id_tipo_contato = ? " );
		sql.append(" where id = ?");
		try{
			connection = ConnectionFactory.createConnectionToMySQL();
			preparedStatement = connection.prepareStatement(sql.toString());
			preparedStatement.setString(1, contato.getNrContato());
			preparedStatement.setLong(2, contato.getTipoContato().getId());
			preparedStatement.setLong(3, contato.getId());
			preparedStatement.executeUpdate();
			result = true;
		}catch (Exception e) {
			throw new DAOException(e);
		}finally{
			try{
				if(preparedStatement != null){
					preparedStatement.close();
				}
				if(connection != null){
					connection.close();
				}
			}catch (Exception e) {
				throw new DAOException(e);
			}
		}
		return result;
	}
	
	public boolean excluirContatoPorId(long idContato) throws DAOException{
		boolean result = false;
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		StringBuilder sql = new StringBuilder();
		sql.append("delete from contato ");
		sql.append(" where id= ?");
		try{
			connection = ConnectionFactory.createConnectionToMySQL();
			preparedStatement = connection.prepareStatement(sql.toString());
			preparedStatement.setLong(1, idContato);
			preparedStatement.execute();
			result = true;
		}catch (Exception e) {
			throw new DAOException(e);
		}finally{
			try{
				if(preparedStatement != null){
					preparedStatement.close();
				}
				if(connection != null){
					connection.close();
				}
			}catch (Exception e) {
				throw new DAOException(e);
			}
		}
		return result;
	}
}

